﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using info.lundin.Math;
using System.Collections;

namespace Urbini.Fabio._5BI.EquazioniDifferenziali
{
    public class Eulero
    {
        // Input
        public int Intervalli { get; set; }
        public double x0 { get; set; }
        public double y0 { get; set; }
        public double xSegnato { get; set; }
        public string funzione { get; set; }

        public double h { get; set; }

        public Eulero(int Intervalli, double x0, double y0, double xSegnato, string funzione)
        {
            this.Intervalli = Intervalli;
            this.x0 = x0;
            this.y0 = y0;
            this.xSegnato = xSegnato;
            this.funzione = funzione;
            h = (xSegnato - x0) / Intervalli;
        }
        public Points Metodo()
        {
            Points pi = new Points();
            pi.Add(new Point(x0, y0));

            for (int i = 1; i < Intervalli ; i++)
            {
                double xi = pi[i - 1].X + h;
                double yi = pi[i - 1].Y + h * Funzione(xi, pi[i-1].Y);
                pi.Add(new Point(xi, yi));
            }
            return pi;
        }
        public double Funzione(string x, string y)
        {
            ExpressionParser e = new ExpressionParser();
            Hashtable hash = new Hashtable();

            // Vengono RIMOSSI TUTTI GLI SPAZI 
            funzione = funzione.Trim();
            // Aggiunto oggetto key,value
            hash["x"] = x;
            hash["y"] = y;
            return e.Parse(funzione, hash);
        }
        public double Funzione(double x, double y)
        {
            ExpressionParser e = new ExpressionParser();
            Hashtable hash = new Hashtable();

            // Vengono RIMOSSI TUTTI GLI SPAZI 
            funzione = funzione.Trim();
            // Aggiunto oggetto key,value
            hash["x"] = x.ToString();
            hash["y"] = y.ToString();
            return e.Parse(funzione, hash);
        }
    }

    public class Point
    {
        public double X { get; set; }
        public double Y { get; set; }

        public Point(double X, double Y) { this.X = X; this.Y = Y; }
    }
    public class Points : List<Point>
    {

    }
}
